package main

import (
	"fmt"
	"go-basics/cli"
	"go-basics/context"
	"go-basics/controlflow"
	"go-basics/datastructures"
	"go-basics/deferpkg"
	"go-basics/errors"
	"go-basics/filetime"
	"go-basics/functions"
	"go-basics/interfaces"
	"go-basics/json"
	"go-basics/methodset"
	"go-basics/network"
	"go-basics/pkgmgr"
	"go-basics/reflection"
	"go-basics/sync"
	"go-basics/typeops"
	"go-basics/types"
)

func main() {
	fmt.Println("=== Go语言基础语法演示 ===")

	// 演示基本类型和变量
	fmt.Println("\n--- 基本类型和变量 ---")
	types.DemoBasicTypes()

	// 演示函数
	fmt.Println("\n--- 函数 ---")
	functions.DemoFunctions()

	// 演示控制流
	fmt.Println("\n--- 控制流 ---")
	controlflow.DemoControlFlow()

	// 演示接口
	fmt.Println("\n--- 接口 ---")
	interfaces.DemoInterfaces()

	// 演示goroutine和通道
	fmt.Println("\n--- Goroutine和通道 ---")
	DemoConcurrency()

	// 演示错误处理
	fmt.Println("\n--- 错误处理 ---")
	errors.DemoErrorHandling()

	// 演示高级类型操作
	fmt.Println("\n--- 高级类型操作 ---")
	typeops.DemoAdvancedTypeOps()

	// 演示高级数据结构
	fmt.Println("\n--- 高级数据结构 ---")
	datastructures.DemoAdvancedDataStructures()

	// 演示文件和时间操作
	fmt.Println("\n--- 文件和时间操作 ---")
	filetime.DemoFileAndTimeOperations()

	// 演示包管理
	fmt.Println("\n--- 包管理 ---")
	pkgmgr.DemoPackageManagement()

	// 演示网络编程
	fmt.Println("\n--- 网络编程 ---")
	network.APIServer()
	network.DemoHttpClient()

	// 演示JSON处理
	fmt.Println("\n--- JSON处理 ---")
	json.DemoJSONHandling()

	// 演示命令行参数解析
	fmt.Println("\n--- 命令行参数解析 ---")
	cli.DemoCommandLineArgs()

	// 演示互斥锁和同步原语
	fmt.Println("\n--- 互斥锁和同步原语 ---")
	sync.DemoSyncPrimitives()

	// 演示context包
	fmt.Println("\n--- Context包 ---")
	context.DemoContextFeatures()

	// 演示反射
	fmt.Println("\n--- 反射 ---")
	reflection.DemoReflectionFeatures()

	// 演示defer的高级用法
	fmt.Println("\n--- defer的高级用法 ---")
	// `defer` 是 Go 语言的关键字，不能用作包名，需要确认包名是否有误，推测可能包名是 `deferpkg` 之类的，
	// 由于当前信息无法准确得知正确包名，仅做演示，将 `defer` 重命名为 `deferpkg` 示例。
	// 实际使用时请替换为正确的包名。
	// 此处假设包名修改为了 `deferpkg`
	deferpkg.DemoDeferFeatures()

	// 演示方法集
	fmt.Println("\n--- 方法集 ---")
	methodset.DemoMethodSet()
}

// 演示并发特性
func DemoConcurrency() {
	// 创建通道
	msgChan := make(chan string)
	doneChan := make(chan bool)

	// 启动goroutine
	go func() {
		for i := 0; i < 3; i++ {
			msgChan <- fmt.Sprintf("goroutine消息 %d", i)
		}
		close(msgChan)
	}()

	// 启动另一个goroutine处理消息
	go func() {
		for msg := range msgChan {
			fmt.Println("收到:", msg)
		}
		doneChan <- true
	}()

	// 等待完成
	<-doneChan
	fmt.Println("并发演示完成")
}
